<?php
 /**
 * Determine le type de separateur pour les chemins d'acces en fonction de l'os
 * @return string Caractere Separateur
 */
 Function determine_separateur_chemin ()
  {
   $separateur = "/" ;
   If (!IsSet ($GLOBALS ['HTTP_USER_AGENT']))
    {
     If (!Empty ($GLOBALS ['HTTP_SERVER_VARS']) && IsSet ($GLOBALS ['HTTP_SERVER_VARS']['HTTP_USER_AGENT']))
      { $GLOBALS ['HTTP_USER_AGENT'] = $GLOBALS ['HTTP_SERVER_VARS']['HTTP_USER_AGENT'] ; }
     Else
      { $GLOBALS ['HTTP_USER_AGENT'] = @GetEnv ('HTTP_USER_AGENT') ; }
    }
   // window$ ?
   If (!Empty ($GLOBALS ['HTTP_USER_AGENT']) && EReg ('[^(]*\((.*)\)[^)]*', $GLOBALS ['HTTP_USER_AGENT'], $regs))
    {
     If (ERegi ('Win', $regs [1])) { $separateur = "\\" ; }
    }
   Return $separateur ;
  }
 
 /**
 * Fonction qui test si le repertoire $repertoire a des droits d'ecriture
 * @param string $repertoire Nom du repertoire
 * @return int 0=Pas de droits, 1=Droit d'ecriture
 */
 Function test_ecriture_rep ($repertoire)
  {
   $ok = 0 ;
   @MkDir ($repertoire) ;
   If ($fiche = @FOpen ($repertoire."/essai.php", "w"))
    {
     @FPuts ($fiche, "<?php \$ok=1 ; ?>") ;
     @FClose ($fiche) ;
     @Include ($repertoire."/essai.php") ;
     @UnLink ($repertoire."/essai.php") ;
    }
   Return $ok  ;
  }
 
 /**
 * Fonction qui test si le fichier $repertoire/$fichier a des droits d'ecriture
 * @param string $repertoire Nom du repertoire contenant le fichier
 * @param string $repertoire Nom du fichier dans ce repertoire
 * @return int 0=Pas de droits, 1=Droit d'ecriture
 */
 Function test_ecriture_fichier ($repertoire, $fichier)
  {
   $ok = 0 ;
   If (File_Exists ($repertoire."/".$fichier))
    {
     If ($fiche = @FOpen ($repertoire."/".$fichier, "a")) { $ok = 1 ; FClose ($fiche) ; }
    }
   Else { $ok = test_ecriture_rep ($repertoire) ; }
   Return $ok  ;
  }

 /**
 * Fonction qui test si le fichier $repertoire/$fichier a des droits de lecture
 * @param string $repertoire Nom du repertoire contenant le fichier
 * @param string $repertoire Nom du fichier dans ce repertoire
 * @return int 0=Pas de droits, 1=Droit d'ecriture
 */
 Function test_lecture_fichier ($repertoire, $fichier)
  {
   $ok = 0 ;
   If (File_Exists ($repertoire."/".$fichier))
    {
     If ($fiche = @FOpen ($repertoire."/".$fichier, "r")) { $ok = 1 ; FClose ($fiche) ; }
    }
   Return $ok  ;
  }
 
 /**
 * Fonction de verification de version de Garennes
 * @param mixed $id_sql Identifiant de connexion SQL
 * @param array $test Table de test de version (voir /include/liste_tables.inc)
 * @return array [0]=Nom de la version,[1]=Numero de la version
 */
 Function verif_version ($id_sql, $test)
  {
   $i = $test [0][0] ;
   $ok = 0 ;
   While (($ok == 0) And ($i >= 1))
    {
     $version = 0 ;
     If ((Is_Numeric ($test [$i][1])) Or ($test [$i][1] == "C") Or ($test [$i][1] == "F"))
      {
       If ($test [$i][1] == "C")
        {
         If (test_presence_contenu ($test [$i][2], $test [$i][3], $test [$i][4], $test [$i][5], $id_sql) == 1) { $ok = 1 ; $version = $test [$i+1][0] ; $num_version = $i+1 ; }
        }
       ElseIf ($test [$i][1] == "F")
        {
         For ($j = 1 ; $j <= $test [$i][2] ; $j++)
          {
           If (File_Exists ($test [$i][2+$j])) { $ok = 1 ; $version = $test [$i+1][0] ; $num_version = $i+1 ; }
          }
        }
       Else
        {
         For ($j = 1 ; $j <= Abs ($test [$i][1]) ; $j++)
          {
           //If (test_presence_table ($test [$i][$j+1], $id_sql) == 1) { $version++ ; }
           If ($test [$i][1] > 0)
            {
             If (test_presence_table ($test [$i][$j+1], $id_sql) == 1) { $version++ ; }
            }
           ElseIf ($test [$i][1] == -1)
            {
             If (test_presence_champ ($test [$i][$j*3-1], $test [$i][$j*3], $id_sql) == 1) { $version++ ; }
            }
	   ElseIf ($test [$i][1] == -2)
            {
             If (test_presence_champ ($test [$i][$j*3-1], $test [$i][$j*3], $id_sql) == 0) { $version++ ; }
            }
          }
         If ($version == Abs ($test [$i][1])) { $ok = 1 ; $version = $test [$i+1][0] ; $num_version = $i+1 ; }
        }
      }
     $i-- ;
    }
   $t [0] = $version ;
   $t [1] = $num_version ;
   Return $t ;
  }
 
 /**
 * Effacement d'un repertoire recursivement (Auteur : Damien Seguy)
 * @param string $repertoire Repertoire a effacer
 * @return int Nombre de fichiers effaces
 */
 Function rmdir_recursif ($repertoire)
  {
   $rep = @OpenDir ($repertoire) ;
   $total = 0 ;
   While ($fichier = @ReadDir ($rep))
    {
     $f = Array ('.','..') ;
     If (!In_Array ($fichier, $f))
      {
       If (Is_Dir ($repertoire."/".$fichier))
        {
         $total += rmdir_recursif ("$repertoire/$fichier") ;
        }
       Else
        {
         @UnLink ("$repertoire/$fichier") ;
         $total++ ;
        }
      }
    }
   @CloseDir ($rep) ;
   @RmDir ($repertoire) ;
   Return $total ;
  }

 /**
 * Decompactage du fichier de mise a jour
 * @param string $fichier Fichier a decompacter
 * @param string $nom_rep_tempo Nom du repertoire temporaire
 * @param string $chemin_tempo Chemin d'acces au repertoire temporaire
 * @return int 0=Probleme de creation de repertoire,1=Preparation pour la mise a jour OK
 */
 Function decompactage ($fichier, $chemin_tempo, $nom_rep_tempo)
  {
   $separateur = determine_separateur_chemin () ;
   //Echo "Analyse du fichier : ".$fichier."<br>" ;
   $fiche = FOpen ($fichier, "r") ;
   // Lecture du nombre de fichiers
   $d1 = FRead ($fiche, 1) ;
   $d2 = FRead ($fiche, 1) ;
   $nombre = Ord ($d1)*256+Ord ($d2) ;
   //Echo " Nombre de fichiers : ".$nombre."<br>" ;
   For ($i = 1 ; $i <= $nombre ; $i++)
    {
     $d1 = FRead ($fiche, 1) ; $d2 = FRead ($fiche, 1) ;
     $d3 = FRead ($fiche, 1) ; $d4 = FRead ($fiche, 1) ;
     $taille [$i] = Ord ($d1)*16777216+Ord ($d2)*65536+Ord ($d3)*256+Ord ($d4) ;
     $d = FRead ($fiche, 1) ;
     $nom [$i] = "" ;
     While ($d != Chr (0))
      {
       $nom [$i] .= $d ;
       $d = FRead ($fiche, 1) ;
      }
     //Echo " Fichier : ".$nom [$i]." -> ".$taille [$i]."<br>" ;
    }
   // Extraction
   rmdir_recursif ($chemin_tempo.$separateur.$nom_rep_tempo) ;
   $ok = @MkDir ($chemin_tempo.$separateur.$nom_rep_tempo, 0700) ;
   If ($ok == 1)
    {
     For ($i = 1 ; $i <= $nombre ; $i++)
      {
       $contenu = FRead ($fiche, $taille [$i]) ;
       $f = FOpen ($chemin_tempo.$separateur.$nom_rep_tempo.$separateur.$nom [$i], "w") ;
       FPuts ($f, $contenu) ;
       FClose ($f) ;
      }
     Return 1 ;
    }
   Else { Return 0 ; }
  }
 
 /**
 * Verification d'ecriture des fichiers de mise a jour
 * @param string $fichier Fichier a analyser
 * @param string $nom_rep_tempo Nom du repertoire temporaire
 * @param string $chemin_tempo Chemin d'acces au repertoire temporaire
 * @param string $chemin_destination Chemin de destination du logiciel
 * @param string $fichier_contenu Fichier contenant les donnees
 * @return array [x]:0=Fichier R,1=Fichier RW,2=Rep R,3=Rep RW
 */
 Function verification_ecriture ($fichier, $chemin_tempo, $nom_rep_tempo, $chemin_destination, $fichier_contenu)
  {
   $separateur = determine_separateur_chemin () ;
   //Echo "Analyse des fichiers renseign&eacute;s par : ".$fichier."<br>" ;
   Include ($chemin_tempo.$separateur.$nom_rep_tempo.$separateur.$fichier) ;

   $verif [0] = $fiche [0][0] ;
   
   For ($i = 1 ; $i <= $fiche [0][0] ; $i++)
    {
     //echo "Fichier ".$fiche [$i][0].$fiche [$i][1]." -> " ;
     $fiche [$i][0] = Str_Replace ("/", $separateur, $fiche [$i][0]) ;
     $fiche [$i][1] = Str_Replace ("/", $separateur, $fiche [$i][1]) ;
     If ($fiche [$i][1] != "")
      {
       If (File_Exists ($chemin_destination.$separateur.$fiche [$i][0].$separateur.$fiche [$i][1]))
        {
         // Fichier existe
         If (Is_Writable ($chemin_destination.$separateur.$fiche [$i][0].$separateur.$fiche [$i][1])) { $verif [$i] = 1 ; }
         Else { $verif [$i] = 0 ; }
        }
       Else
        {
         // Fichier n'existe pas -> On verifie le repertoire pour creation
         If (test_ecriture_rep ($chemin_destination.$separateur.$fiche [$i][0])) { $verif [$i] = 3 ; }
         ElseIf (test_ecriture_rep ($chemin_destination)) { $verif [$i] = 3 ; }
         Else { $verif [$i] = 2 ; }
        }
      }
     ElseIf (test_ecriture_rep ($chemin_destination)) { $verif [$i] = 3 ; }
     Else { $verif [$i] = 2 ; }
     /*
     Switch ($verif [$i])
      {
       Case 0 : echo "RO" ; Break ;
       Case 1 : echo "RW" ; Break ;
       Case 2 : echo "R" ; Break ;
       Case 3 : echo "RW" ; Break ;
      }
     echo "<br>" ;
     */
    }
   // Lecture des donnees
   If ($fiche [$i][1] != "")
    {
     $f = FOpen ($chemin_tempo.$separateur.$nom_rep_tempo.$separateur.$fichier_contenu, "r") ;
     For ($i = 1 ; $i <= $fiche [0][0] ; $i++)
      {
       If (!File_Exists ($chemin_tempo.$separateur.$nom_rep_tempo.$fiche [$i][0]))
        {
         $chemins = Explode ($separateur, $fiche [$i][0]) ;
         $chemin_actuel = "" ;
         For ($j = 1 ; $j < SizeOf ($chemins)-1 ; $j++)
          { 
	   $chemin_actuel .= $chemins [$j].$separateur ;
	   If (!File_Exists ($chemin_tempo.$separateur.$nom_rep_tempo.$separateur.$chemin_actuel))
            {
             @MkDir ($chemin_tempo.$separateur.$nom_rep_tempo.$separateur.$chemin_actuel, 0700) ;
	    }
  	  }
        }
       $contenu = FRead ($f, $fiche [$i][2]) ;
       $fe = FOpen ($chemin_tempo.$separateur.$nom_rep_tempo.$separateur.$fiche [$i][0].$fiche [$i][1], "w") ;
       FPuts ($fe, $contenu) ;
       FClose ($fe) ;
      }
    }
 
   Return $verif ;
  }
 
 /**
 * Renvoi les caracteristiques des bases de donnees gerees actuellement
 * @param array $bdd Tableau listant les bdd presentes
 * @param array $test Liste des versions
 * @return array Tableau de caracteristiques
 * Format : [0][0]=Nombre de bases, [x][0]=Nom en clair, [x][1]=Nom bdd, [x][2]=Entete, [x][3]=0:Non actif,1:Actif, [x][4]=Version, [x][5]=Nombre patchs, [x][6+y]=Patch
 */
 Function caracteristiques_bases ($bdd, $test)
  {
   Global $id_sql, $multi_bases, $sql_adresse, $sql_secondaire, $sql_tertiaire, $sql_qui, $sql_passe, $sql_port, $timeout ;
   // Parcours les differentes bases et determine les mises a jour
   If ($bdd [0][0] > 0)
    {
     $bases_reelles [0][0] = 0 ;
     For ($i = 1 ; $i <= $bdd [0][0] ; $i++)
      {
       UnSet ($id_cb) ;
       If ($multi_bases == 0) { $entete = $bdd [$i][1]."_" ; $id_cb = $id_sql ; }
       Else
        {
         $entete = "" ;
         $id_cb = connexion_bdd ($sql_adresse,$sql_secondaire,$sql_tertiaire,$sql_qui,$sql_passe,$bdd [$i][1],$sql_port,$timeout) ;
        }
       If (IsSet ($id_cb) And ($id_cb))
        {
         $ok = SQL_commande ("SHOW TABLES", $id_cb) ;
         If (SQL_nbr_lignes ($ok) > 0)
          {
	   If (($bdd [$i][1] == $sql_base) And ($bdd [$i][3] == 0)) { $bdd [$i][3] == 1 ; }
           $bases_reelles [0][0]++ ;
           $bases_reelles [$bases_reelles [0][0]][0] = $bdd [$i][0] ;
           $bases_reelles [$bases_reelles [0][0]][1] = $bdd [$i][1] ;
           $bases_reelles [$bases_reelles [0][0]][2] = $bdd [$i][2] ;
           $bases_reelles [$bases_reelles [0][0]][3] = $bdd [$i][3] ;
           // Patch applique ?
           $res = SQL_commande ("SELECT patch,date FROM ".$entete."patch ORDER BY date", $id_cb) ;
           If (SQL_nbr_lignes ($res) > 0)
            {
             $nbr_patch = SQL_nbr_lignes ($res) ;
	     $bases_reelles [$bases_reelles [0][0]][5] = $nbr_patch ;
             For ($j = 0 ; $j < $nbr_patch ; $j++)
              {
               $ll = SQL_ligne_suivante ($res) ;
               $num_patch_1 = $num_patch_2 = "" ;
               $p = Explode ("_", $ll [0]) ;
               For ($k = 0 ; $k < StrLen ($p [0]) ; $k++)
                {
                 If (Is_Numeric (SubStr ($p [0], $k, 1))) { $num_patch_1 .= SubStr ($p [0], $k, 1) ; If ($k < StrLen ($p [0])-1) { $num_patch_1 .= "." ; } }
                 Else { $num_patch_1 .= SubStr ($p [0], $k, 1) ; }
                }
               For ($k = 0 ; $k < StrLen ($p [1]) ; $k++)
                {
                 If (Is_Numeric (SubStr ($p [1], $k, 1))) { $num_patch_2 .= SubStr ($p [1], $k, 1) ; If ($k < StrLen ($p [1])-1) { $num_patch_2 .= "." ; } }
                 Else { $num_patch_2 .= SubStr ($p [1], $k, 1) ; }
                }
               If ($j == 0)
                {
                 If ($bdd [$i][1] == $sql_base) { $bdd [$i][3] = $bases_reelles [$i][3] = 1 ; }
		 $version = verif_version ($id_cb, $test) ;
		 $bases_reelles [$bases_reelles [0][0]][4] = $version [0] ;
	        }
	       $d = Explode (" ", $ll [1]) ;
	       $bases_reelles [$bases_reelles [0][0]][6+$j] = $num_patch_1."|".$num_patch_2."|".$d [0]."|".$d [1] ;
              }
            }
           Else
            {
	     If ($bdd [$i][1] == $sql_base) { $bdd [$i][3] = $bases_reelles [$i][3] = 1 ; }
             // Aucun patch : Determine la version
	     $version = verif_version ($id_cb, $test) ;
	     $bases_reelles [$bases_reelles [0][0]][4] = $version [0] ;
	     $bases_reelles [$bases_reelles [0][0]][5] = 0 ;
            }
           If ($multi_bases == 1) { $ok = SQL_fermeture ($id_cb) ; }
	  }
        }
      }
    }
   Return $bases_reelles ;
  }
?>